/**
 ******************************************************************************
 * @file main.c
 * @author GX (2524913364@qq.com)
 * @brief lcd默认可以绘制基础几何图形，另外有两种额外配置可选，在lcd.h中通过配置宏选择是
 *        否开启：USE_FONTS被打开可以支持显示ASCII码字符串，如需关闭则将其注释。
 *               SUPPORT_BMP被打开可以支持显示BMP图片，如需关闭则将其注释
 *        宏 LCD_BLOCK 定义的数量可以决定虚拟显存的块数（这里需要对lcd的显存的知识有简单
 *        的理解，如果实在不理解可以按照下面的用例用法照搬）
 * @version 1.0.0 
 * @date 2023-09-03
 * 
 * @copyright Copyright (c) 2022
 * 
 *----------------------------------------------------------------------------*
 *  Remark         : Description                                              *
 *----------------------------------------------------------------------------*
 *  Change History :                                                          *
 *  <Date>     | <Version> | <Author>       | <Description>                   *
 *----------------------------------------------------------------------------*
 *  2023-09-03 | 1.0.0     | GX             | Write LCD demo                  *
 *----------------------------------------------------------------------------*
 *                                                                            *
 ******************************************************************************
 */
/*----------------------------- start of file -------------------------------*/

#include <stdio.h>
#include <unistd.h>

#include "lcd.h"


int main(int argc, char* argv[])
{
  /* 初始化lcd */
  if (lcd_init())
  {
    printf("lcd 初始化成功\n");
  }
  else
  {
    printf("lcd 初始化失败\n");
    return -1;
  }

  /* 多显存用法一般都是在内存中开辟几块显示屏内存称为显存，每次显示在屏幕上的内容只是其中
     一块显存的内容，要刷新显示前现在下一块显存区域渲染好要现实的内容后，再将屏幕显可见区
     移到下一个显存区域。
     对于 gec6818 最多可以有三个这样的显存区域，这里分别定义为虚拟显存A、B、C三个区，可以
     在lcd.h 通过宏配置1～3块 */

  /* 全屏显示颜色------------------------------------------------------------- */
  {  /* 这里先介绍多显存区块的标准使用方法 */
    //（这里用的全局变量都是在 lcd.c 中定义好的）

    /* 1、显示区块变量+1,表示要对下一个显存区块操作。（不用担心这个变量会溢出） */
    g_view_block++;
    //想要真正操作到指定的显存区，单靠 g_view_block 是不够的，还要利用宏函数 LCD_DISPLAY 才能
    //将指针指向要操作的显存区，这个宏函数的本质就是对指针 g_lcd_fb 做偏移。
    //因此这个宏函数会频繁使用。
    
    /* 2、对下一个显存区清屏 */
    LCD_CLEAN (LCD_DISPLAY(g_lcd_fb, g_view_block));      /* 清屏 */

    /* 3、显示内容，这里根据自己需要调用想要的接口 */
    LCD_FULL(LCD_DISPLAY(g_lcd_fb, g_view_block), LCD_RED); /* 全屏显示红色 */

    /* 4、将屏幕显示区域移到下一个显存区，这时就真正把想要的内容显示出来 */
    LCD_SET_DISPLAY(g_fd_lcd, &g_vinfo, g_view_block);    /* 设置屏幕可见区 */
  }

  sleep(1);

  { /* 如果不想那么麻烦不停地切换显存区，可以只用一个显存区，需要将宏 LCD_BLOCK 配置为1 */
    LCD_SET_DISPLAY_A(g_fd_lcd, &g_vinfo);/* 先将可见区移回A区，因为前面有移动过可见区 */
    LCD_FULL(g_lcd_fb, LCD_BLUE);         /* 直接显示内容 */
    sleep(1);
    LCD_FULL(g_lcd_fb, LCD_RED); 
    sleep(1);
    LCD_FULL(g_lcd_fb, LCD_YELLOW); 
    /* 需要注意的是只用一个显存区只能是在刷新图片不频繁的场景，如果刷图较快，会有明显闪屏
       因为你可以看到屏幕快速地将像素点一个一个渲染到屏幕上的过程。
       因此如果是快速刷图的场景建议使用至少2个显存区来显示图片，这样可以让图片先渲染好再呈现
       在屏幕上，显示效果会更好 */
  }

  sleep(1);

  /* 绘制图形----------------------------------------------------------------- */
  /* 在同一个显存区绘制几个图形 */
  LCD_CLEAN (LCD_DISPLAY(g_lcd_fb, ++g_view_block));

  lcd_rectangle(LCD_DISPLAY(g_lcd_fb, g_view_block), 10, 10, 20, 20, LCD_BLUE);
  lcd_circular(LCD_DISPLAY(g_lcd_fb, g_view_block), 60, 40, 20, LCD_GREEN);
  lcd_ring(LCD_DISPLAY(g_lcd_fb, g_view_block), 60, 200, 500, 30, LCD_CYAN);

  /* 绘制一个出界的圆 */
  lcd_circular(LCD_DISPLAY(g_lcd_fb, g_view_block), LCD_WIDE+10, -10, 50, LCD_PURPLE); 

  LCD_SET_DISPLAY(g_fd_lcd, &g_vinfo, g_view_block);

  /* 显示bmp图片----------------------------------------------------------------- */
  LCD_CLEAN (LCD_DISPLAY(g_lcd_fb, ++g_view_block));
  /* 注意路径，将编译完的文件放到板子里时注意图片文件的路径 */
  lcd_show_bmp(LCD_DISPLAY(g_lcd_fb, g_view_block), "./sample/poke_wallpaper.bmp",
                0, 0);    /* 这个接口直接显示一个bmp图片，是一个背景图 */
  LCD_SET_DISPLAY(g_fd_lcd, &g_vinfo, g_view_block);
  
  sleep(1);

  LCD_CLEAN (LCD_DISPLAY(g_lcd_fb, ++g_view_block));

  lcd_show_bmp(LCD_DISPLAY(g_lcd_fb, g_view_block), "./sample/poke_wallpaper.bmp",
                0, 0);
  lcd_show_bmp_sticker(LCD_DISPLAY(g_lcd_fb, g_view_block), "./sample/pokemon.bmp",
                        200, 250);

  LCD_SET_DISPLAY(g_fd_lcd, &g_vinfo, g_view_block);

  /* 利用buf显示图片 */
  /* 这个buf是用户自己开辟的，【图片内容->buf(缓存)->显存区块->显示屏】相当于显示流程再加一个中
     间过程这样做的好处是可以将想要显示的指定位置中，比如有时候只需要一张10*10像素的图片，通过平
     铺到buf里面形成整张画面。而且这个buf就像一张画纸，可供开发者随意修改。对buf的使用可见接口
     lcd_show_buf() 和 lcd_bmp_to_Buf()
     当然理论上也可以直接在上面说的显存区A、B、C中直接画。但是从逻辑上最好对显存区的操作是一次性
     处理整个画面。
    
  sleep(1);
  /* 显示字符串-------------------------------------------------------------------- */
  /* 设置字体大小和颜色 */
  LCD_SetFont(&Font32x48);
  LCD_SetColors(LCD_BLUE, LCD_RED, true);

  LCD_CLEAN (LCD_DISPLAY(g_lcd_fb, ++g_view_block));
  /* 在第二行显示 */
  DispStringLine_EN(LCD_DISPLAY(g_lcd_fb, g_view_block), 2, 0, "Hello world");
  LCD_SET_DISPLAY(g_fd_lcd, &g_vinfo, g_view_block);

  sleep(3);
  /* 清空第二行 */
  LCD_ClearLine(LCD_DISPLAY(g_lcd_fb, g_view_block), 2); 
  
  /* 关闭lcd释放资源 */
  printf("exit...\n");
  lcd_close();

	return 0;
}

  




 

/*------------------------------ end of file --------------------------------*/
